#include #include #define MAX_N 5 #define MAX_M 5 #define LARGO_MAX 20 /* # de movimientos -> , abajo , <- , arriba */ #define MOVIMIENTOS 4 #define SELECCIONES 4 #define ROTACIONES 3 /* definicion de posiciones dentro del arreglo de posibles movimientos : arr[4] = {1,0,1,0} */ #define POS_MOV_DERECHA 0 #define POS_MOV_ABAJO 1 #define POS_MOV_IZQUIERDA 2 #define POS_MOV_ARRIBA 3 /* definicion de movimientos */ #define SIN_MOVIMIENTO 0 #define SELECCION 1 #define MOV_DERECHA 2 #define MOV_ABAJO 3 #define MOV_IZQUIERDA 4 #define MOV_ARRIBA 5 /* rotaciones */ #define ROT_DER 6 #define ROT_IZQ -6 #define SOLUCION 12 typedef struct { char matriz[MAX_N * MAX_M]; /* codificacion de la matriz */ char n,m; /* n : # filas , m : # columnas */ char i,j; /* indice de seleccion */ char movimiento; /* movimiento que se aplico */ long posEstadoAnterior; /* posicion dentro del archivo de la matriz anterior */ } TEstado; /* variables globales */ char numFilas; char numColumnas; int marcFI; int marcCI; int marcFF; int marcCF; int puente[MAX_N * MAX_M]; int contadorMovidas = 0; TEstado arrSelecciones[MAX_N * MAX_M - (MAX_N + MAX_M - 1)]; TEstado arrRotaciones[ROTACIONES]; char matriz[MAX_N][MAX_M]; char arrMovimientos[MOVIMIENTOS]; /* cuenta los estados generados */ long contadorEstados = 0; long posEstadoGenerador = 0; FILE *f = NULL; #include "func.h" void main() { int aux; printf("\nIngrese # de filas : "); scanf("%d",&aux); numFilas = aux; printf("\nIngrese # de columnas : "); scanf("%d",&aux); numColumnas = aux; printf("\nNumFilas : %d",numFilas); printf("\nNumColumnas : %d",numColumnas); inicializarMatriz(); TEstado original; long contadorEstados = 0; original.i = 0; original.j = 0; original.m = numColumnas; original.n = numFilas; original.movimiento = SOLUCION; original.posEstadoAnterior = -1; codificarMatriz(&original); printf("\n\nIngreso de matriz a buscar\n\n"); for(char i = 0; i < numFilas; i++ ) for(char j = 0; j < numColumnas; j++) { printf("M[%d][%d] : ",i,j); scanf("%d",&matriz[i][j]); } printf("\n\nMatriz a buscar\n"); printf("---------------\n\n"); imprimirMatriz(numFilas,numColumnas); TEstado buscar; buscar.n = numFilas; buscar.m = numColumnas; buscar.i = 0; buscar.j = 0; buscar.posEstadoAnterior = -1; codificarMatriz(&buscar); crearArchivo("rotps.dat"); f = fopen("rotps.dat","r+b"); fseek(f,0,SEEK_SET); fwrite(&original,sizeof(TEstado),1,f); contadorEstados++; posEstadoGenerador = 0; TEstado estadoGenerador; printf("\nGenerando combinaciones..."); while(posEstadoGenerador < contadorEstados) { PosicionarArchivo(f,posEstadoGenerador); fread(&estadoGenerador,sizeof(TEstado),1,f); generarDerivaciones(&estadoGenerador,&contadorEstados,f); posEstadoGenerador++; if(contadorEstados > 1000000) break; } long posDeEncontrada; char r = buscarEstadoMatriz(buscar,f,&posDeEncontrada); if (r == 1) { fseek(f,posDeEncontrada * sizeof(TEstado),SEEK_SET); fread(&buscar,sizeof(TEstado),1,f); buscar.movimiento = -buscar.movimiento; int aproxCamino = (int) floor(log(posDeEncontrada) / log(3.0)); printf("\n\nAproximadamente el camino encontrado tiene %d pasos.",aproxCamino); printf("\npresione tecla para continuar..."); getchar(); getchar(); long sigPos = buscar.posEstadoAnterior; printf("\n\n--- CAMINO ---\n"); printf("\nSELECCIONAR en posicion 0,0"); marcFI = 0; marcCI = 0; marcFF = buscar.i; marcCF = buscar.j; contadorMovidas = 0; obtenerPuente(&marcFI,&marcCI,&marcFF,&marcCF,puente,&contadorMovidas); imprimirEstadoFinal(buscar); marcFI = buscar.i; marcCI = buscar.j; while(1) { fseek(f,sigPos * sizeof(TEstado),SEEK_SET); fread(&buscar, sizeof(TEstado),1,f); buscar.movimiento = -buscar.movimiento; marcFF = buscar.i; marcCF = buscar.j; contadorMovidas = 0; obtenerPuente(&marcFI,&marcCI,&marcFF,&marcCF,puente,&contadorMovidas); marcFI = marcFF; marcCI = marcCF; imprimirEstadoFinal(buscar); printf("\n..."); getchar(); sigPos = buscar.posEstadoAnterior; if (sigPos < 0) break; } } else { printf("\nEl programa no encuentro el camino de solucion."); } fclose(f); f = fopen("rotps.dat","w"); fclose(f); }